package com.xiaoKe.zhonghzu.global.tool;

/**
 * @ProjectName : zhongzhu
 * @Author : Shijingna
 * @Time : 2025/11/4 16:27
 * @Description : 文件描述
 */
import android.content.Context;
import android.content.Intent;
import android.os.Looper;
import android.util.Log;
import android.widget.Toast;

import com.xiaoKe.zhonghzu.MainActivity;

import java.io.PrintWriter;
import java.io.StringWriter;
import java.io.Writer;

/**
 * 全局异常捕捉器：捕获未处理异常，避免App崩溃
 */
public class GlobalExceptionHandler implements Thread.UncaughtExceptionHandler {
    private static final String TAG = "GlobalExceptionHandler";
    private static GlobalExceptionHandler instance;
    private Thread.UncaughtExceptionHandler defaultHandler; // 系统默认异常处理器
    private Context appContext;

    // 单例初始化
    public static GlobalExceptionHandler getInstance() {
        if (instance == null) {
            synchronized (GlobalExceptionHandler.class) {
                if (instance == null) {
                    instance = new GlobalExceptionHandler();
                }
            }
        }
        return instance;
    }

    /**
     * 初始化：接管系统异常处理
     * @param context Application Context
     */
    public void init(Context context) {
        appContext = context.getApplicationContext();
        defaultHandler = Thread.getDefaultUncaughtExceptionHandler(); // 保存系统默认处理器
        Thread.setDefaultUncaughtExceptionHandler(this); // 设置自定义处理器
    }

    /**
     * 异常捕获回调（所有未处理的异常都会走到这里）
     */
    @Override
    public void uncaughtException(Thread t, Throwable e) {
        try {
            // 1. 记录异常日志（可选：保存到本地或上传服务器）
            String exceptionLog = getExceptionLog(e);
            Log.e(TAG, "全局捕获异常：\n" + exceptionLog);

            // 2. 主线程显示Toast提示（需手动初始化Looper）
            new Thread(() -> {
                Looper.prepare();
                Toast.makeText(appContext, "程序出现异常，已自动恢复", Toast.LENGTH_LONG).show();
                Looper.loop();
            }).start();

            // 3. 可选：重启App（根据业务需求决定是否重启）
//             restartApp();

            // 4. 延迟一段时间，避免立即退出（可选）
            Thread.sleep(1000);

        } catch (InterruptedException e1) {
            Log.e(TAG, "异常处理失败：" + e1.getMessage());
        } finally {
            // 5. 若不需要重启，可让系统默认处理器继续处理（退出App）
            // defaultHandler.uncaughtException(t, e);
        }
    }

    /**
     * 生成异常详细日志（包含堆栈信息）
     */
    private String getExceptionLog(Throwable e) {
        Writer writer = new StringWriter();
        PrintWriter printWriter = new PrintWriter(writer);
        e.printStackTrace(printWriter);
        Throwable cause = e.getCause();
        while (cause != null) {
            cause.printStackTrace(printWriter);
            cause = cause.getCause();
        }
        printWriter.close();
        return writer.toString();
    }

    /**
     * 重启App（可选功能）
     */
    private void restartApp() {
        // 跳转到首页（根据你的App首页调整）
        Intent intent = new Intent(appContext, MainActivity.class);
        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);
        appContext.startActivity(intent);
        // 结束当前进程（避免残留）
        android.os.Process.killProcess(android.os.Process.myPid());
        System.exit(0);
    }
}